/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

import com.javabeans.ForoManager;
import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Carrera;
import com.javabeans.Etiqueta;
import com.javabeans.Foro;
import com.javabeans.Tiempo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class AdminForo implements ForoManager{
    private Connection c;
    public AdminForo(Connection c){
        this.c=c;
    }
    
    @Override
    public List<Foro> getForos(int idCarrera) throws DataException {
        List<Foro> foros = new ArrayList<Foro>();
        try{
            foros = this.getForosGral(0,idCarrera,"", false,"","");
        }catch(DataException e){
            throw new DataException(" Error! AdminForo -> getForos(idCarrera) "+e.getMessage());
        }
        return foros;
    }
    
    @Override
    public List<Foro> getForos(int idEtiqueta,int idCarrera) throws DataException {
        List<Foro> foros = new ArrayList<Foro>();
        try{
            foros = this.getForosGral(idEtiqueta, idCarrera, "",false,"","");
        }catch(DataException e){
            throw new DataException(" Error! AdminForo -> getForos(idEtiqueta, idCarrera) "+e.getMessage());
        }
        return foros;
    }
    @Override
    public List<Foro> getForos(int idCarrera, String palabra) throws DataException {
        List<Foro> foros = new ArrayList<Foro>();
        try{
            foros = this.getForosGral(0, idCarrera, palabra,false,"","");
        }catch(DataException e){
            throw new DataException(" Error! AdminForo -> getForos(idCarrera, palabra) "+e.getMessage());
        }
        return foros;
    }
    @Override
    public List<Foro> getForos(int idCarrera, boolean estado) throws DataException {
        List<Foro> foros = new ArrayList<Foro>();
        try{
            foros = this.getForosGral(0, idCarrera, "",true,"","");
        }catch(DataException e){
            throw new DataException(" Error! AdminForo -> getForos(idCarrera, estado) "+e.getMessage());
        }
        return foros;
    }
    @Override
    public List<Foro> getForos(int idCarrera, String fechaIni, String fechaFin) throws DataException {
        List<Foro> foros = new ArrayList<Foro>();
        try{
            foros = this.getForosGral(0, idCarrera, "", false, fechaIni, fechaFin);
        }catch(DataException e){
            throw new DataException(" Error! AdminForo -> getForos(idCarrera, fechaIni, fechaFin) "+e.getMessage());
        }
        return foros;
    }
    @Override
    public int getIdForo() throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IFNULL(max(IDFORO)+1,1) AS ID FROM FORO";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("ID");
        }catch(SQLException e){
            throw new DataException(" Error! AdminForo -> getIdForo() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
    public List<Foro> getForosGral(int idEtiqueta, int idCarrera, String palabra, boolean estado, String fechaIni, String fechaFin) throws DataException {
        List<Foro> foros=new ArrayList<Foro>();
        ResultSet rs=null;
        PreparedStatement preSt=null;

        try{
            String  query = "SELECT F.IDFORO";
                    query +=", F.IDESTUDIANTE";
                    query +=", F.IDUSUARIO";
                    query +=", F.AUTOR";
                    query +=", F.TITULO";
                    query +=", DATE_FORMAT(F.FECHA,'%d/%m/%Y %H:%i:%s') FECHA";
                    query +=", F.RESPUESTA";
                    query +=", F.VOTO";
                    query +=", F.LEIDO";
                    query +=", DATE_FORMAT(F.ULTRESPUESTA,'%d/%m/%Y %H:%i:%s') ULTRESPUESTA ";
                    query +=", C.IDETIQUETA";
                    query +=", C.NOMBRE";
                    query +=", CA.NOMBRE";
                    query +=", TIMESTAMPDIFF(YEAR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as ANIOS";
                    query +=", TIMESTAMPDIFF(MONTH,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MESES";
                    query +=", TIMESTAMPDIFF(WEEK,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEMANAS";
                    query +=", TIMESTAMPDIFF(DAY,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as DIAS";
                    query +=", TIMESTAMPDIFF(HOUR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as HORAS";
                    query +=", TIMESTAMPDIFF(MINUTE,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MINUTOS";
                    query +=", TIMESTAMPDIFF(SECOND,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEGUNDOS";
                    query +=" FROM FORO F";
                    query +=" INNER JOIN ETIQUETA C ON F.IDETIQUETA=C.IDETIQUETA";
                    query +=" INNER JOIN CARRERA CA ON F.IDCARRERA=CA.IDCARRERA";
                    if(idEtiqueta == 0)
                        query +=" WHERE F.IDFORO=F.FOR_IDFORO";
                    else
                        query +=" WHERE F.IDFORO=F.FOR_IDFORO AND F.IDETIQUETA="+idEtiqueta;
                    if(palabra.length() != 0)
                        query +=" AND  TITULO LIKE '%"+palabra+"%'";
                    if(estado)
                        query +=" AND F.RESPUESTA=0";
                    
                    if(fechaIni.length()>0 && fechaFin.length()>0)
                        query +=" AND F.FECHA BETWEEN '"+fechaIni+"' AND '"+fechaFin+"'";// 2012-07-17 13:32:00
                    query +=" AND F.ACTIVO=1";
                    query +=" AND F.IDCARRERA="+idCarrera;
                    query +=" ORDER BY F.ULTRESPUESTA DESC";            
            preSt=c.prepareStatement(query);
            rs=preSt.executeQuery();
            while(rs.next()){
                Foro f = new Foro();
                f.setIdForo(rs.getInt("IDFORO"));
                f.setIdEstudiante(rs.getInt("IDESTUDIANTE"));
                f.setIdUsuario(rs.getInt("IDUSUARIO"));
                f.setIdCarrera(idCarrera);
                f.setAutor(rs.getString("AUTOR"));
                f.setTitulo(rs.getString("TITULO"));
                f.setFecha(rs.getString("FECHA"));
                f.setRespuesta(rs.getInt("RESPUESTA"));
                f.setVoto(rs.getInt("VOTO"));
                f.setLeido(rs.getInt("LEIDO"));
                
                Etiqueta co = new Etiqueta();
                co.setIdEtiqueta(rs.getInt("IDETIQUETA"));
                co.setNombre(rs.getString("NOMBRE"));
                f.setEtiqueta(co);
                
                Carrera ca = new Carrera();
                ca.setIdCarrera(idCarrera);
                ca.setNombre(rs.getString("CA.NOMBRE"));
                f.setCarrera(ca);
                
                Tiempo t = new Tiempo();
                t.setAnios(rs.getInt("ANIOS"));
                t.setMeses(rs.getInt("MESES"));
                t.setSemanas(rs.getInt("SEMANAS"));
                t.setDias(rs.getInt("DIAS"));
                t.setHoras(rs.getLong("HORAS"));
                t.setMinutos(rs.getLong("MINUTOS"));
                t.setSegundos(rs.getLong("SEGUNDOS"));
                f.setTiempo(t);
                foros.add(f);
            }
        }catch(SQLException ex){
            throw new DataException(" -> getForosGral(idEtiqueta,idCarrera) "+ex.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return foros;
    }
    @Override
    public List<Foro> getOpiniones(int forIdForo, int idCarrera) throws DataException {
        List<Foro> foros=new ArrayList<Foro>();
        ResultSet rs=null;
        PreparedStatement preSt=null;

        try{
            String  query = "SELECT F.IDFORO";
                    query +=", F.IDESTUDIANTE";
                    query +=", F.IDUSUARIO";
                    query +=", F.FOR_IDFORO";
                    query +=", F.AUTOR";
                    query +=", F.TITULO";
                    query +=", F.MENSAJE";
                    query +=", DATE_FORMAT(F.FECHA,'%d/%m/%Y %H:%i:%s') FECHA";
                    query +=", F.RESPUESTA";
                    query +=", F.VOTO";
                    query +=", F.LEIDO";
                    query +=", DATE_FORMAT(F.ULTRESPUESTA,'%d/%m/%Y %H:%i:%s') ULTRESPUESTA ";
                    query +=", C.IDETIQUETA";
                    query +=", C.NOMBRE";
                    query +=", CA.NOMBRE";
                    query +=", TIMESTAMPDIFF(YEAR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as ANIOS";
                    query +=", TIMESTAMPDIFF(MONTH,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MESES";
                    query +=", TIMESTAMPDIFF(WEEK,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEMANAS";
                    query +=", TIMESTAMPDIFF(DAY,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as DIAS";
                    query +=", TIMESTAMPDIFF(HOUR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as HORAS";
                    query +=", TIMESTAMPDIFF(MINUTE,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MINUTOS";
                    query +=", TIMESTAMPDIFF(SECOND,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEGUNDOS";
                    query +=" FROM FORO F";
                    query +=" INNER JOIN ETIQUETA C ON F.IDETIQUETA=C.IDETIQUETA";
                    query +=" INNER JOIN CARRERA CA ON F.IDCARRERA=CA.IDCARRERA";
                    query +=" WHERE FOR_IDFORO="+forIdForo;
                    query +=" AND F.IDCARRERA="+idCarrera;
                    query +=" AND F.ACTIVO=1";
                    query +=" ORDER BY F.ULTRESPUESTA ASC";            
            preSt=c.prepareStatement(query);
            rs=preSt.executeQuery();
            while(rs.next()){
                Foro f = new Foro();
                f.setIdForo(rs.getInt("IDFORO"));
                f.setIdEstudiante(rs.getInt("IDESTUDIANTE"));
                f.setIdUsuario(rs.getInt("IDUSUARIO"));
                f.setFor_idForo(rs.getInt("F.FOR_IDFORO"));
                f.setFor_idForo( forIdForo );
                f.setAutor(rs.getString("AUTOR"));
                f.setTitulo(rs.getString("TITULO"));
                f.setMensaje(rs.getString("MENSAJE"));
                f.setFecha(rs.getString("FECHA"));
                f.setRespuesta(rs.getInt("RESPUESTA"));
                f.setVoto(rs.getInt("VOTO"));
                f.setLeido(rs.getInt("LEIDO"));
                
                Etiqueta co = new Etiqueta();
                co.setIdEtiqueta(rs.getInt("IDETIQUETA"));
                co.setNombre(rs.getString("NOMBRE"));
                f.setEtiqueta(co);
                
                Carrera ca = new Carrera();
                ca.setIdCarrera(idCarrera);
                ca.setNombre(rs.getString("CA.NOMBRE"));
                f.setCarrera(ca);
                
                Tiempo t = new Tiempo();
                t.setAnios(rs.getInt("ANIOS"));
                t.setMeses(rs.getInt("MESES"));
                t.setSemanas(rs.getInt("SEMANAS"));
                t.setDias(rs.getInt("DIAS"));
                t.setHoras(rs.getLong("HORAS"));
                t.setMinutos(rs.getLong("MINUTOS"));
                t.setSegundos(rs.getLong("SEGUNDOS"));
                f.setTiempo(t);
                foros.add(f);
            }
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> getOpiniones(forIdForo) "+ex.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return foros;
    }
    @Override
    public void updateCantLeido(int idForo, long cant, int idCarrera) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE FORO SET LEIDO="+cant+" WHERE IDFORO="+idForo+" AND IDCARRERA="+idCarrera;           
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> updateCantLeido(int idForo, long cant) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public void saveForo(Foro f) throws DataException {
        
        PreparedStatement preSt = null;
        String query = "";
        try{
            query="INSERT INTO FORO VALUES("+f.getIdForo();
            query+= ", "+f.getIdEstudiante();
            query+= ", "+f.getIdUsuario();
            query+= ", "+f.getFor_idForo();
            query+= ", "+f.getIdCarrera();
            query+= ", '"+f.getAutor();
            query+= "', '"+f.getTitulo();
            query+= "', "+f.getIdEtiqueta();
            query+= ", '"+f.getMensaje();
            query+= "', '"+f.getFecha();
            query+= "', "+f.getRespuesta();
            query+= ", "+f.getVoto();
            query+= ", "+f.getLeido();
            query+= ", '"+f.getUltRespuesta();
            query+= "', "+f.isActivo()+")";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
           throw new DataException(" Error! saveForo(Foro f) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public void updateRespuestas(int forIdForo, int respuesta) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE FORO SET RESPUESTA="+respuesta+" WHERE IDFORO="+forIdForo;           
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> updateRespuestas(forIdForo, respuesta) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public int getCantRespuesta(int forIdForo) throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT RESPUESTA FROM FORO WHERE IDFORO="+forIdForo+" LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("RESPUESTA");
        }catch(SQLException e){
            throw new DataException(" Error! AdminForo -> getCantRespuesta(forIdForo) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }

    public Foro getOpinion(int forIdForo, int idCarrera, int idForo) throws DataException {
        Foro f = new Foro();
        ResultSet rs = null;
        PreparedStatement preSt = null;

        try{
            String  query = "SELECT F.IDFORO";
                    query +=", F.IDESTUDIANTE";
                    query +=", F.IDUSUARIO";
                    query +=", F.AUTOR";
                    query +=", F.TITULO";
                    query +=", F.MENSAJE";
                    query +=", DATE_FORMAT(F.FECHA,'%d/%m/%Y %H:%i:%s') FECHA";
                    query +=", F.RESPUESTA";
                    query +=", F.VOTO";
                    query +=", F.LEIDO";
                    query +=", DATE_FORMAT(F.ULTRESPUESTA,'%d/%m/%Y %H:%i:%s') ULTRESPUESTA ";
                    query +=", C.IDETIQUETA";
                    query +=", C.NOMBRE";
                    query +=", CA.NOMBRE";
                    query +=", TIMESTAMPDIFF(YEAR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as ANIOS";
                    query +=", TIMESTAMPDIFF(MONTH,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MESES";
                    query +=", TIMESTAMPDIFF(WEEK,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEMANAS";
                    query +=", TIMESTAMPDIFF(DAY,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as DIAS";
                    query +=", TIMESTAMPDIFF(HOUR,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as HORAS";
                    query +=", TIMESTAMPDIFF(MINUTE,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as MINUTOS";
                    query +=", TIMESTAMPDIFF(SECOND,TIMESTAMP(F.FECHA),TIMESTAMP(now())) as SEGUNDOS";
                    query +=" FROM FORO F";
                    query +=" INNER JOIN ETIQUETA C ON F.IDETIQUETA=C.IDETIQUETA";
                    query +=" INNER JOIN CARRERA CA ON F.IDCARRERA=CA.IDCARRERA";
                    query +=" WHERE FOR_IDFORO="+forIdForo;
                    query +=" AND F.IDCARRERA="+idCarrera;
                    query +=" AND F.IDFORO="+idForo;                    
                    query +=" LIMIT 1";            
            preSt=c.prepareStatement(query);
            rs=preSt.executeQuery();
            while(rs.next()){
                f.setIdForo(rs.getInt("IDFORO"));
                f.setIdEstudiante(rs.getInt("IDESTUDIANTE"));
                f.setIdUsuario(rs.getInt("IDUSUARIO"));
                f.setFor_idForo( forIdForo );
                f.setAutor(rs.getString("AUTOR"));
                f.setTitulo(rs.getString("TITULO"));
                f.setMensaje(rs.getString("MENSAJE"));
                f.setFecha(rs.getString("FECHA"));
                f.setRespuesta(rs.getInt("RESPUESTA"));
                f.setVoto(rs.getInt("VOTO"));
                f.setLeido(rs.getInt("LEIDO"));
                
                Etiqueta co = new Etiqueta();
                co.setIdEtiqueta(rs.getInt("IDETIQUETA"));
                co.setNombre(rs.getString("NOMBRE"));
                f.setEtiqueta(co);
                
                Carrera ca = new Carrera();
                ca.setIdCarrera(idCarrera);
                ca.setNombre(rs.getString("CA.NOMBRE"));
                f.setCarrera(ca);
                
                Tiempo t = new Tiempo();
                t.setAnios(rs.getInt("ANIOS"));
                t.setMeses(rs.getInt("MESES"));
                t.setSemanas(rs.getInt("SEMANAS"));
                t.setDias(rs.getInt("DIAS"));
                t.setHoras(rs.getLong("HORAS"));
                t.setMinutos(rs.getLong("MINUTOS"));
                t.setSegundos(rs.getLong("SEGUNDOS"));
                f.setTiempo(t);
            }
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> getOpinion(forIdForo, idCarrera, idForo) "+ex.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return f;
    }

    public void updateVoto(int voto, int forIdForo, int idCarrera) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE FORO SET VOTO="+voto+" WHERE IDFORO="+forIdForo+" AND IDCARRERA="+idCarrera;           
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> updateVoto(voto, forIdForo, idCarrera) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    @Override
    public int getCantVoto(int forIdForo) throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT VOTO FROM FORO WHERE IDFORO="+forIdForo+" LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("VOTO");
        }catch(SQLException e){
            throw new DataException(" Error! AdminForo -> getCantVoto(forIdForo) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    @Override
    public int getCantLeido(int forIdForo) throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT LEIDO FROM FORO WHERE IDFORO="+forIdForo+" LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("LEIDO");
        }catch(SQLException e){
            throw new DataException(" Error! AdminForo -> getCantLeido(forIdForo) "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    @Override
    public void updateActivo(int idCarrera, int forIdForo) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE FORO SET ACTIVO=0 WHERE IDFORO="+forIdForo+" AND IDCARRERA="+idCarrera;            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" Error! AdminForo -> updateActivo(idCarrera, forIdForo) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
}
